#include <iostream>
#include <unordered_map>
#include <vector>
#include <Windows.h>

using namespace std;

// 定义MAC地址长度为4 bit
using MACAddress = int;

// 定义端口类型
using Port = int;

// 定义帧结构体
struct Frame
{
    MACAddress source;
    Port sourcePort;
    MACAddress destination;
};

// 模拟网桥类
class Bridge
{
private:
    unordered_map<MACAddress, Port> macTable;

public:
    // 处理帧的函数
    void processFrame(const Frame &frame)
    {
        // 学习源地址和端口
        macTable[frame.source] = frame.sourcePort;

        // 查找目的地址对应的端口
        if (frame.destination == 0xF)
        {
            // 广播帧，输出所有端口（假设只有网段1和2两个端口，这里简化为输出1和2）
            cout << "目的端口: 1, 2" << endl;
        }
        else
        {
            auto it = macTable.find(frame.destination);
            if (it != macTable.end())
            {
                cout << "目的端口: " << it->second << endl;
            }
            else
            {
                // 目的地址未知，广播到除源端口外的所有端口（假设只有网段1和2两个端口）
                if (frame.sourcePort == 1)
                {
                    cout << "目的端口: 2" << endl;
                }
                else
                {
                    cout << "目的端口: 1" << endl;
                }
            }
        }

        // 输出MAC地址表
        cout << "当前MAC地址表: " << endl;
        for (const auto &entry : macTable)
        {
            cout << "MAC地址: " << entry.first << ", 端口: " << entry.second << endl;
        }
        cout << endl;
    }
};

int main()
{
    SetConsoleOutputCP(65001);

    Bridge bridge;
    // 示例输入帧
    vector<Frame> frames = {
        {0x1, 1, 0x2},
        {0x2, 2, 0x1},
        {0x3, 1, 0xF}};

    for (const auto &frame : frames)
    {
        bridge.processFrame(frame);
    }

    return 0;
}